﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Cataloger
{
    public class SorterListViewCataloger:IComparer<IObiektCatalogera>
    {
        private ColHeader columnToSort;

        public ColHeader ColumnToSort
        {
            get { return columnToSort; }
            set { columnToSort = value; }
        }
        private SortOrder orderOfSort;

        public SortOrder OrderOfSort
        {
            get { return orderOfSort; }
            set { orderOfSort = value; }
        }
        #region IComparer<IObiektCatalogera> Members
        public SorterListViewCataloger()
        {
            OrderOfSort = SortOrder.None;
        }
        public int Compare(IObiektCatalogera x, IObiektCatalogera y)
        {
            if (x is ObiektDyskowy && y is ObiektDyskowy)
            {
                return obiektDyskowyCompare(x, y);

            }
            else if (x is Nosnik && y is Nosnik)
            {
                return nosnikCompare(x, y);
            }
            else if (x is Katalog && y is Katalog)
            {
                return katalogCompare(x, y);
            }
            else if (x is ArchiwumEntry && y is ArchiwumEntry)
            {
                return archEntryCompare(x, y);
            }
            return 0;
        }

        private int obiektDyskowyCompare(IObiektCatalogera x, IObiektCatalogera y)
        {
            int compareResult = 0;
            ObiektDyskowy temp1 = x as ObiektDyskowy;
            ObiektDyskowy temp2 = y as ObiektDyskowy;

            if (ColumnToSort.PropertyName == "szerObNazwa")
            {
                compareResult = string.Compare(temp1.Nazwa, temp2.Nazwa);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObRozsz")
            {
                compareResult = string.Compare(Path.GetExtension(temp1.Nazwa), Path.GetExtension(temp2.Nazwa));
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObTyp")
            {
                compareResult = string.Compare(temp1.Typ, temp2.Typ);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObNosnik")
            {
                compareResult = string.Compare(temp1.Nosnik.Nazwa, temp2.Nosnik.Nazwa);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObKatalog")
            {
                compareResult = string.Compare(temp1.KataloG.Nazwa, temp2.KataloG.Nazwa);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObRozmiar")
            {
                compareResult = temp1.Rozmiar.CompareTo(temp2.Rozmiar);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObDatUtw")
            {
                compareResult = DateTime.Compare(temp1.DataUtw, temp2.DataUtw);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObCzasUtw")
            {
                compareResult = temp1.DataUtw.ToLongTimeString().CompareTo(temp2.DataUtw.ToLongTimeString());
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObDzienUtw")
            {
                compareResult = temp1.DataUtw.DayOfWeek.CompareTo(temp2.DataUtw.DayOfWeek);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObDatMod")
            {
                compareResult = DateTime.Compare(temp1.DataMod, temp2.DataMod);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObCzasMod")
            {
                compareResult = temp1.DataMod.ToLongTimeString().CompareTo(temp2.DataMod.ToLongTimeString());
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObDzienMod")
            {
                compareResult = temp1.DataMod.DayOfWeek.CompareTo(temp2.DataMod.DayOfWeek);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObDatDos")
            {
                compareResult = DateTime.Compare(temp1.DataDost, temp2.DataDost);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObCzasDos")
            {
                compareResult = temp1.DataDost.ToLongTimeString().CompareTo(temp2.DataDost.ToLongTimeString());
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObDzienDos")
            {
                compareResult = temp1.DataDost.DayOfWeek.CompareTo(temp2.DataDost.DayOfWeek);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObAtrybuty")
            {
                compareResult = temp1.Atrybuty.CompareTo(temp2.Atrybuty);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObKategoria")
            {
                if (temp1.Kategoria != null && temp2.Kategoria != null)
                {
                    compareResult = string.Compare(temp1.Kategoria.Nazwa, temp2.Kategoria.Nazwa);
                    return WynikSortowania(compareResult);
                }
                else if (temp1.Kategoria != null && temp2.Kategoria == null)
                {
                    return WynikSortowania(1);
                }
                else if (temp1.Kategoria == null && temp2.Kategoria != null)
                {
                    return WynikSortowania(-1);
                }
                else
                {
                    return 0;
                }
            }
            else if (ColumnToSort.PropertyName == "szerObSciezka")
            {
                compareResult = string.Compare(temp1.Sciezka, temp2.Sciezka);
                return WynikSortowania(compareResult);
            }


            return 0;
        }

        private int archEntryCompare(IObiektCatalogera x, IObiektCatalogera y)
        {
            int compareResult = 0;
            ArchiwumEntry temp1 = x as ArchiwumEntry;
            ArchiwumEntry temp2 = y as ArchiwumEntry;

            if (ColumnToSort.PropertyName == "szerObNazwa")
            {
                compareResult = string.Compare(temp1.Nazwa, temp2.Nazwa);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObRozsz")
            {
                compareResult = string.Compare(Path.GetExtension(temp1.Nazwa), Path.GetExtension(temp2.Nazwa));
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObTyp")
            {
                compareResult = string.Compare(temp1.Typ, temp2.Typ);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObNosnik")
            {
                compareResult = string.Compare(temp1.Nosnik.Nazwa, temp2.Nosnik.Nazwa);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObKatalog")
            {
                compareResult = string.Compare(temp1.PlikArchiwumRodzic.KataloG.Nazwa, temp2.PlikArchiwumRodzic.KataloG.Nazwa);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObRozmiar")
            {
                compareResult = temp1.Rozmiar.CompareTo(temp2.Rozmiar);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObDatUtw")
            {
                return 0;
            }
            else if (ColumnToSort.PropertyName == "szerObCzasUtw")
            {
                return 0;
            }
            else if (ColumnToSort.PropertyName == "szerObDzienUtw")
            {
                return 0;
            }
            else if (ColumnToSort.PropertyName == "szerArchDataMod")
            {
                compareResult = DateTime.Compare(temp1.DataModyfikacj, temp2.DataModyfikacj);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerArchCzasMod")
            {
                compareResult = temp1.DataModyfikacj.ToLongTimeString().CompareTo(temp2.DataModyfikacj.ToLongTimeString());
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerArchDzienMod")
            {
                compareResult = temp1.DataModyfikacj.DayOfWeek.CompareTo(temp2.DataModyfikacj.DayOfWeek);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerObDatDos")
            {
                return 0;
            }
            else if (ColumnToSort.PropertyName == "szerObCzasDos")
            {
                return 0;
            }
            else if (ColumnToSort.PropertyName == "szerObDzienDos")
            {
                return 0;
            }
            else if (ColumnToSort.PropertyName == "szerObAtrybuty")
            {
                return 0;
            }
            else if (ColumnToSort.PropertyName == "szerObKategoria")
            {
                if (temp1.Kategoria != null && temp2.Kategoria != null)
                {
                    compareResult = string.Compare(temp1.Kategoria.Nazwa, temp2.Kategoria.Nazwa);
                    return WynikSortowania(compareResult);
                }
                else if (temp1.Kategoria != null && temp2.Kategoria == null)
                {
                    return WynikSortowania(1);
                }
                else if (temp1.Kategoria == null && temp2.Kategoria != null)
                {
                    return WynikSortowania(-1);
                }
                else
                {
                    return 0;
                }
            }
            else if (ColumnToSort.PropertyName == "szerObSciezka")
            {
                compareResult = string.Compare(temp1.Sciezka, temp2.Sciezka);
                return WynikSortowania(compareResult);
            }


            return 0;
        }

        private int nosnikCompare(IObiektCatalogera x, IObiektCatalogera y)
        {
            int compareResult = 0;
            Nosnik temp1 = x as Nosnik;
            Nosnik temp2 = y as Nosnik;

            if (ColumnToSort.PropertyName == "szerNosNazwa")
            {
                compareResult = string.Compare(temp1.Nazwa, temp2.Nazwa);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerNosKatalog")
            {
                compareResult = temp1.Katalog.Nazwa.CompareTo(temp2.Katalog.Nazwa);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerNosPodlaczony")
            {
                compareResult = temp1.CzyPodlaczony().CompareTo(temp2.CzyPodlaczony());
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerNosAkt")
            {
                compareResult = temp1.DataAktulizacji.CompareTo(temp2.DataAktulizacji);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerNosDodano")
            {
                compareResult = temp1.DataDodania.CompareTo(temp2.DataDodania);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerNosDyskFiz")
            {
                if (temp1.DyskFizyczny != null && temp2.DyskFizyczny != null)
                {
                    compareResult = string.Compare(temp1.DyskFizyczny, temp2.DyskFizyczny);
                    return WynikSortowania(compareResult);
                }
                else if (temp1.DyskFizyczny != null && temp2.DyskFizyczny == null)
                {
                    return WynikSortowania(1);
                }
                else if (temp1.DyskFizyczny == null && temp2.DyskFizyczny != null)
                {
                    return WynikSortowania(-1);
                }
                else
                {
                    return 0;
                }
            }
            else if (ColumnToSort.PropertyName == "szerNosDriveFormat")
            {
                compareResult = String.Compare(temp1.DriveFormat, temp2.DriveFormat);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerNosNrSeryjny")
            {
                compareResult = temp1.NrSeryjny.CompareTo(temp2.NrSeryjny);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerNosRodzajDysku")
            {
                compareResult = temp1.RodzajDysku.CompareTo(temp2.RodzajDysku);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerNosStatus")
            {
                compareResult = temp1.Status.CompareTo(temp2.Status);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerNosWielkosc")
            {
                compareResult = temp1.Wielkosc.CompareTo(temp2.Wielkosc);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerNosWolne")
            {
                compareResult = temp1.WolneMiejsce.CompareTo(temp2.WolneMiejsce);
                return WynikSortowania(compareResult);
            }



            return 0;
        }

        private int katalogCompare(IObiektCatalogera x, IObiektCatalogera y)
        {
            int compareResult = 0;
            Katalog temp1 = x as Katalog;
            Katalog temp2 = y as Katalog;

            if (ColumnToSort.PropertyName == "szerKatNazwa")
            {
                compareResult = string.Compare(temp1.Nazwa, temp2.Nazwa);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerKatSciez")
            {
                compareResult = temp1.nazwaZaladowana.CompareTo(temp2.nazwaZaladowana);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerKatDatAkt")
            {
                compareResult = temp1.DataAktualizacji.CompareTo(temp2.DataAktualizacji);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerKatDatUtw")
            {
                compareResult = temp1.DataUtworzenia.CompareTo(temp2.DataUtworzenia);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerKatFoldery")
            {
                compareResult = temp1.IleFolderow.CompareTo(temp2.IleFolderow);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerKatPliki")
            {
                compareResult = temp1.IlePlikow.CompareTo(temp2.IlePlikow);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerKatHaslo")
            {
                compareResult = temp1.JestHaslo.CompareTo(temp2.JestHaslo);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerKatSkompr")
            {
                compareResult = temp1.Kompresuj.CompareTo(temp2.Kompresuj);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerKatNosniki")
            {
                compareResult = temp1.LiczbaNosnikow.CompareTo(temp2.LiczbaNosnikow);
                return WynikSortowania(compareResult);
            }
            else if (ColumnToSort.PropertyName == "szerKatRozmiar")
            {
                compareResult = temp1.Rozmiar.CompareTo(temp2.Rozmiar);
                return WynikSortowania(compareResult);
            }
  


            return 0;
        }

        private int WynikSortowania(int compareResult)
        {
            if (OrderOfSort == SortOrder.Ascending)
            {
                return compareResult;
            }
            else if (OrderOfSort == SortOrder.Descending)
            {
                return -compareResult;
            }
            else
            {
                return 0;
            }
        }

        #endregion
    }
}
